package me.yuzho.study.concurrency;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/** 显式创建互斥量来防止纯种冲突
 * 
 * 使用显式创建的互斥量，可以使用try-finally子句在系统发生异常上将系统维护在良好状态上，
 * 使用synchronized关键字，如果抛出异常，你没有机会做清理锁的工作，系统无法维持在良好状态上
 * @author yzhou-citrix
 *
 */
public class MutexEvenGenerator extends EvenGenerator {

    private int currentEvenValue = 0;
    
    private Lock lock = new ReentrantLock();
    
    @Override
    public int next() {
        lock.lock();
        try {
            ++currentEvenValue; //递增不是原子性操作，如果不保护操作，即使单一的递增也不安全
            Thread.yield();
            ++currentEvenValue;
            return currentEvenValue;
        } finally {
            lock.unlock();
        }
    }
    
    public static void main(String[] args) {
        EvenChecker.test(new MutexEvenGenerator(),10);
    }
}
